/**
 * ThisType<{需要this直接使用的类型}>
 */

/**
 * 怎么在类型体操中处理this类型？
 */
type Foo = {
  a: number;
  b: number;
  bar: {
    c: number;
    d: number;
  };
  foo: () => number;
} & ThisType<{
  a: number;
  b: number;
  c: number; // 这里会把bar中的c 和d 接到this中不是bar中
  d: number;
}>; // & ThisType 限定了在Foo对象中使用this的时候只会提示a和b
const foo: Foo = {
  a: 10,
  b: 20,
  bar: {
    c: 10,
    d: 20,
  },
  foo() {
    return this.a + this.b + this;
  },
};

/**
 * 示例
 */
type ObjectDescriptor<D, M> = {
  data?: D;
  methods?: M & ThisType<D & M>;
};

function makeObject<D, M>(desc: ObjectDescriptor<D, M>): D & M {
  let data: object = desc.data || {};
  let methods: object = desc.methods || {};
  return { ...data, ...methods } as D & M;
}
